package han.chensing.latos.common.level.content.objects;

import java.io.Serial;
import java.io.Serializable;
import java.util.HashMap;

import han.chensing.latos.common.file.annotation.CirnoNotSerialize;
import han.chensing.latos.common.level.content.EditorConfig;
import han.chensing.latos.common.level.content.timeLine.TimeLineRow;

public class CommonObject implements Serializable {

    @Serial
    private static final long serialVersionUID = -7930076663279951203L;

    protected String name;
    @CirnoNotSerialize
    protected HashMap<EditorConfig,String> editorConfigs;
    protected TimeLineRow timeLineRow;

    public CommonObject(){
        this("Unnamed object");
    }

    public CommonObject(String name){
        this.name=name;
        this.timeLineRow=new TimeLineRow(name);
        this.editorConfigs=new HashMap<>();
    }

    public String getConfig(EditorConfig config,String defaultValue){
        defaultPutConfig(config,defaultValue);
        return editorConfigs.get(config);
    }

    public boolean getConfigAsBoolean(EditorConfig config,boolean defaultValue){
        defaultPutConfig(config,String.valueOf(defaultValue));
        return Boolean.parseBoolean(editorConfigs.get(config));
    }

    public int getConfigAsInteger(EditorConfig config,int defaultValue){
        defaultPutConfig(config,String.valueOf(defaultValue));
        return Integer.parseInt(editorConfigs.get(config));
    }

    public void reverseConfigAsBoolean(EditorConfig config,boolean defaultValue){
        boolean b = getConfigAsBoolean(config, !defaultValue);
        setConfig(config,String.valueOf(!b));
    }

    public void setConfig(EditorConfig config,Object object){
        editorConfigs.remove(config);
        editorConfigs.put(config,object.toString());
    }

    private void defaultPutConfig(EditorConfig config,String value){
        if (!editorConfigs.containsKey(config))
            editorConfigs.put(config,value);
    }

    public HashMap<EditorConfig, String> getEditorConfigs() {
        return editorConfigs;
    }

    public TimeLineRow getTimeLineRow() {
        return timeLineRow;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
